/**
 * Copyright (c) 2007,中企动力华南研发中心
 * All rights reserved.
 */
package com.ce.cetag.tags.checkbox;

import java.io.IOException;
import java.util.List;

import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;

import com.ce.cetag.model.CheckBoxModel;
import com.ce.cetag.util.BlankUtil;
/**
 * 功能描述:复选框标签，可支持全选/限定个数选择功能
 *
 * @author kevin 创建日期：2007年8月29日
 */
public class CheckBoxTag extends TagSupport{
	/**
	 * checkBox的Id
	 */
	private String id;
	/**
	 * checkBox的Name
	 */
	private String name;

	/**
	 * 业务数据集
	 * *为必选属性
	 */
	private List items;

	/**
	 * 是否全选标志,参数值true--表示选择全部时N个限定无效,
	 *    false--表示限定个数时全选无效，建议此时设定checkedNum属性
	 * *为必选属性
	 */
	private Boolean checkAll;

	/**
	 * 限定checkbox被选中的数量,应小于或等于N个业务选项
	 * *为可选属性[默认为0个]
	 */
	private Integer limitNum;


	/**
	 * 业务选项checkBox的显示样式--横着并排(X)/竖立一行(Y)
	 * *为可选属性[默认为横着并排(X)]
	 */
	private String styleType;

	/**
	 * 业务项的总标题：如爱好/级别等
	 */
	private String title;
	/**
	 * span的Id
	 * *为可选属性
	 */
	private String subId;

	/**
	 * 页面展现时,用于标识checkBox中被选中的项
	 * 为被选中的项的id的字符串,id之间需用逗号分隔.
	 * *为可选属性
	 */
	private String checkedIds;
	/**
	 * 全选checkBox样式
	 */
	private String barClassName;
	/**
	 * 功能项checkBox样式
	 */
	private String itemClassName;

	/**
	 * 带全选/不带全选标识。
	 * true  带全选/false  不带全选
	 * *为必选属性
	 */
	private Boolean isSingle;

	/**
	 * 列数
	 */
	private Integer tdSize;


	public Integer getTdSize() {
		return tdSize;
	}

	public void setTdSize(Integer tdSize) {
		this.tdSize = tdSize;
	}

	/**
	 * 标签体开始展现的方法
	 */
	public int doStartTag() throws JspTagException{
		try {
//			获取复选框数据集
			List dataList = this.getItems();

			//被选中的checkBox的Id
			String checkedValue = this.getCheckedIds();
			String[] ids = null;
			if(!BlankUtil.isBlank(checkedValue)){
				ids = checkedValue.split(",");
			}
			//业务域的checkBox
			int bussessNum = dataList.size();
			//限定checkbox被选中的数量,默认为0个
			int checkNum = 0;
			if(this.getLimitNum() != null){
				checkNum = this.getLimitNum();
			}
			//默认为横向排列
			if(this.getStyleType() == null){
				this.setStyleType("X");
			}

			StringBuffer out = new StringBuffer();
			out.append("<span id=\""+this.subId+"\">");
			if(this.getIsSingle()){//带全选功能
				out.append("<input type=\"checkbox\" id=\"");
				out.append(this.getId());
				out.append("_0\"");
				if(!BlankUtil.isBlank(this.getBarClassName())){
					out.append(" class=\"");
					out.append(this.getBarClassName());
					out.append("\"");
				}
				if(!this.getCheckAll()){//限定个数时，全选无效
					out.append(" disabled=\"true\"");
				}
				out.append(" name=\"");
				out.append(this.getName());
				out.append("_0\" onClick=\"allChecked('"+this.subId+"')\"/>");
			}

			if(!BlankUtil.isBlank(this.getTitle()))
				out.append(this.getTitle());
//			out.append("<br>");
//			out.append("<fieldset>");
			//循环出所有的业务选项
		//	int trSize = 1;
		//	int tdSize = bussessNum%trSize > 0 ? bussessNum/trSize + 1 : bussessNum/trSize;
			System.out.println("3333333333333333 " + bussessNum);
			for(int i = 0; i< bussessNum; i++){

				CheckBoxModel node = (CheckBoxModel)dataList.get(i);
				if(getStyleType().equals("Table"))
				{int present = 100/getTdSize();
					if(i % tdSize == 0)
					{
						System.out.println("1111111111111111");
						out.append("<tr>");
					}
					out.append("<td width=\""+ present +"%\" bgcolor=\"#FFFFFF\">");
				}
				if("Y".equals(this.getStyleType())){//表示纵向排列,每个业务项都缩进4个空格
					out.append("&nbsp;&nbsp;&nbsp;&nbsp; ");
				}
				if("X".equals(this.getStyleType())){//表示横向排列,第一个业务项缩进4个空格
					out.append("&nbsp;&nbsp;");
				}
				out.append("<input type=\"checkbox\" id=\"");
				out.append(this.getId());
				out.append("\"");
				if(!BlankUtil.isBlank(this.getItemClassName())){
					out.append(" class=\"");
					out.append(this.getItemClassName());
					out.append("\"");
				}
				out.append(" name=\"");
				out.append(this.getName());
				out.append("\" value=\"");
				out.append(node.getId());
				out.append("\"");

				if(!BlankUtil.isBlank(checkedValue)){//采用页面传入被选中值的方式
					if(node.getId().contains(",")){

						for(String checkedId : ids){
							if(node.getId().contains(checkedId)){
								out.append(" checked=\"true\"");
								break;
							}
						}
					}else{
					for(String checkedId : ids){
						if(checkedId.equals(node.getId())){
							out.append(" checked=\"true\"");
							break;
						}
					}
					}
				}else{//程序构造被选中值方式
					if(node.getCheck()){
						out.append(" checked=\"true\"");
					}
				}

				if(this.getIsSingle()){//带全选功能
					if(!this.getCheckAll()){//非全选
						out.append(" onClick=\"checkAll('"+this.subId+"',");
						out.append(checkNum);
						out.append(")\"");
					}else{
						out.append(" onClick=\"deleteAllChecked('"+this.subId+"')\"");
					}
				}

				out.append(" />");
				out.append(node.getDetail());
				if("Y".equals(this.getStyleType()) && i != bussessNum -1){//表示纵向排列
					out.append(" <br> ");
				}
				if(getStyleType().equals("Table"))
				{
					out.append("</td>");
					if(i % getTdSize() == getTdSize() - 1)
					{
						out.append("</tr>");
					}
				}
//				默认为横向排列

				if("X".equals(this.getStyleType()) && !BlankUtil.isBlank(getTdSize()) && (i%this.getTdSize() == getTdSize() - 1)){
					System.out.println("111111111111111");
					out.append(" <br> ");
				}

			}
//			out.append("</fieldset>");
			out.append("</span>");
			pageContext.getOut().write(out.toString());

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	    return EVAL_BODY_INCLUDE;
	  }

	/**
	 * 标签体结束展现时执行的方法
	 */
	public int doEndTag() throws JspTagException{
		return EVAL_PAGE;
	}
	/**
	 * 释放标签占用的资源
	 */
	public void release(){
		id = null;
		name = null;
		limitNum = null;
		styleType = null;
		items = null;
		title = null;
	}

	public Boolean getCheckAll() {
		return checkAll;
	}


	public void setCheckAll(Boolean checkAll) {
		this.checkAll = checkAll;
	}

	public String getStyleType() {
		return styleType;
	}
	public void setStyleType(String styleType) {
		this.styleType = styleType;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getLimitNum() {
		return limitNum;
	}

	public void setLimitNum(Integer limitNum) {
		this.limitNum = limitNum;
	}

	public List getItems() {
		return items;
	}

	public void setItems(List items) {
		this.items = items;
	}

	public String getCheckedIds() {
		return checkedIds;
	}

	public void setCheckedIds(String checkedIds) {
		this.checkedIds = checkedIds;
	}

	public String getSubId() {
		return subId;
	}

	public void setSubId(String subId) {
		this.subId = subId;
	}

	public String getBarClassName() {
		return barClassName;
	}

	public void setBarClassName(String barClassName) {
		this.barClassName = barClassName;
	}

	public String getItemClassName() {
		return itemClassName;
	}

	public void setItemClassName(String itemClassName) {
		this.itemClassName = itemClassName;
	}

	public Boolean getIsSingle() {
		return isSingle;
	}

	public void setIsSingle(Boolean isSingle) {
		this.isSingle = isSingle;
	}

}
